#include <stdio.h>
#include <stdlib.h>

#define false 0
#define true 1
#define MAXSIZE 5
#define ERROR -1

typedef int ElementType;
typedef int Position;
typedef struct LNode *List;

struct LNode
{
    ElementType Data[MAXSIZE];
    Position Last; /* 保存线性表中最后一个元素的位置 */
};

List MakeEmpty();
Position Find(List L, ElementType X);
bool Insert(List L, ElementType X, Position P);
bool Delete(List L, Position P);

int main()
{
    List L;
    ElementType X;
    Position P;
    int N;

    L = MakeEmpty();
    scanf("%d", &N);
    while (N--)
    {
        scanf("%d", &X);
        if (Insert(L, X, 0) == false)
            printf(" Insertion Error: %d is not in.\n", X);
    }
    scanf("%d", &N);
    while (N--)
    {
        scanf("%d", &X);
        P = Find(L, X);
        if (P == ERROR)
            printf("Finding Error: %d is not in.\n", X);
        else
            printf("%d is at position %d.\n", X, P);
    }
    scanf("%d", &N);
    while (N--)
    {
        scanf("%d", &P);
        if (Delete(L, P) == false)
            printf(" Deletion Error.\n");
        if (Insert(L, 0, P) == false)
            printf(" Insertion Error: 0 is not in.\n");
    }
    system("pause");
    return 0;
}
//创建一个顺序表操作集
/*各个操作函数的定义为：

List MakeEmpty()：创建并返回一个空的线性表；

Position Find( List L, ElementType X )：返回线性表中X的位置。若找不到则返回ERROR；

bool Insert( List L, ElementType X, Position P )：将X插入在位置P并返回true。若空间已满，则打印“FULL”并返回false；如果参数P指向非法位置，则打印“ILLEGAL POSITION”并返回false；

bool Delete( List L, Position P )：将位置P的元素删除并返回true。若参数P指向非法位置，则打印“POSITION P EMPTY”（其中P是参数值）并返回false。*/
List MakeEmpty()
{
    //思路：开辟一片新的存储区域利用指针返回给主函数
    struct LNode *L = (struct LNode *)malloc(sizeof(struct LNode));
    L->Last = -1; //此处的位置应该重置为-1，填入第一个元素之后变成 0
    return L;
}
Position Find(List L, ElementType X) 
{
    //思路：如果表为空就返回ERROR，如果表不为空，就从第一个元素开始（顺序表使用下标较方便，链表则使用指针）
    if (!L)
        return ERROR;
    int count = 0;
    for (; count <= L->Last; ++count)
    {
        if (L->Data[count] == X)
        {
            return count;
        }
    }
    return ERROR;
}

bool Insert(List L, ElementType X, Position P)
{

    if (L->Last == MAXSIZE - 1)
    {
        printf("FULL");
        return false;
    }
    if (P < 0 || P > L->Last + 1)
    {
        //此处在处理时L->Last +1 存在问题，因为此处存储空间有限,此处弄混了表长和存储容量
        printf("ILLEGAL POSITION");
        return false;
    }

    ElementType *p = L->Data + P;
    ElementType *q = L->Data + L->Last; //右侧是指偏移量

    for (; p <= q; --q)
    {
        *(q + 1) = *q;
    }
    *p = X;
    ++L->Last;
    return true;
}

bool Delete(List L, Position P)
{
    //判断插入位置是否合理
    if (P < 0 || P > L->Last)
    {
        printf("POSITION %d EMPTY", P);
        return false;
    }
    ElementType *p = L->Data + P;
    ElementType *q = L->Data + L->Last;
    for (; p <= q; ++p)
    {
        *p = *(p + 1);
    }
    --L->Last;
    return true;
}
